<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // Object.defineProperty(object, propertyName, descriptor):用于定义对象属性中构建属性的特殊状态
        //     object:将要添加属性的目标对象
        //     propertyName:对象中将要添加的属性名称
        //     descriptor:对象参数(描述符)，详细设置改属性在对象中表现形式
        //         value:定义属性的值
        //         writable:该属性是否允许被修改，默认是false
        //         enumerable:该属性是否允许被循环查找，默认是false
        //         configurable:该属性描述是否可删除
        //     注意:
        //         value、writable配置和get、set配置是不能同时定义在同一个属性的配置，并且get、set依赖于一个外部变量，为变量提供数据支持
        //         get取值方法，无参数，需要定义返回值，劫持对象中的属性的取值行为，通过返回值描述该属性的取值
        //         set赋值方法，有参数，无返回值，劫持对象中的赋值行为，参数为属性赋值时传入的新数据

        var user={
            name:"alice"
        };
        user.age=20;
        user["sex"]="男";
        Object.defineProperty(user,"hobby",{
            value:"打篮球",
            writable:false,//如果是false，不允许被修改属性值
            enumerable:false,//如果是false，不允许被循环遍历到
            configurable:false//如果是false，不允许被删除
        });
        user.name="huahua";
        user.sex="女";
        user.hobby="学习";
        // for(var key in user){
        //     console.log(key+"="+user[key]);
        // }
        console.log(delete user.sex);//删除对象中的属性，如果返回true表示可删除，如果是false表示不可删除
        console.log(delete user.hobby);
            
        var info="星期一";
        Object.defineProperty(user,"weekday",{
            //get()、set()方法对数据进行拦截(数据劫持)
            get(){//获取属性，取值的时候，就会触发get方法
                console.log("触发了get方法");
                return info;
            },
            set(val){//设置属性，赋值的时候，就会触发set方法
                console.log("触发了set方法:"+val);
                info=val;
            },
            enumerable:true,
            configurable:false
          
        });
        user.weekday="星期二";//设置weekday属性，就会触发set方法

     
        console.log(user.weekday);//获取weekday属性，就会触发get方法
        console.log(user);
        console.log("--------------------------");
        for(var key in user){
            console.log(user[key]);
        }
        console.log(delete user.weekday);

    </script>
</head>
<body>
    
</body>
</html>